//go:build wireinject
// +build wireinject

package wire

import (
	"github.com/google/wire"

	"gitee.com/krio/grpc-go-server/cmd/lib"
)

// InitApp 主程序 (声明injector的函数签名)
func InitApp() (*App, func(), error) {
	panic(wire.Build(
		wire.Struct(new(App), "*"),
		lib.InitConf,       // 配置
		InitLogger,         // 日志
		lib.InitXormMysql,  // mysql
		lib.InitRedis,      // redis
		newGRPCServer,      // grpc
		ProviderSet,        // ProviderSet
		HandlerProviderSet, // handler
		ServiceProviderSet, // service
	)) // 调用wire.Build方法传入所有的依赖对象以及构建最终对象的函数得到目标对象
}

// InitFillerApp 数据填充
func InitFillerApp() (*FillerApp, func(), error) {
	// 由于wire.go中的函数并没有真正返回值，为避免编译器报错， 简单地用panic函数包装起来即可。不用担心执行时报错， 因为它不会实际运行，只是用来生成真正的代码的依据。
	panic(wire.Build(
		wire.Struct(new(FillerApp), "*"), // 注入全部属性
		lib.InitConf,
		lib.InitXormMysql,
		lib.InitRedis,
		FillerInitLogger,
		ProviderSet,
		FillerHandlerProviderSet,
		FillerServiceProviderSet,
	))
}
